home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
boe.pres.k12.wv.us
/
boe.pres.k12.wv.us.zip
/
boe.pres.k12.wv.us
/
Utilities
/
Xerox Workcentre 5335
/
Windows Scan
/
64-bit_x64
/
Portugues
/
cpsimage.cab
/
data
/
pdf
/
img2mrc.elf
next >
Wrap
Text File
|
2009-03-16
|
6KB
|
187 lines
//img2mrc
#import "documentio.ucm";
#import "fiji2xip.ucm";
#import "fwx2xip.ucm";
#import "ipcore2xip.ucm";
#load "xipProcs/skewAngle.proc";
#load "xipProcs/printImageLayers.proc";
#load "xipProcs/getOcrPage.proc";
LoadClasses ( filename: "xeng" );
IMPORT STRING infile;
IMPORT STRING language = "English";
IMPORT INTEGER ocr = 1;
IMPORT INTEGER visibleText = 0;
IMPORT INTEGER verbosity = 1;
IMPORT STRING format = "pdf";
IMPORT INTEGER security = 0;
IMPORT INTEGER correctImage = 1;
if ( !infile) {
print "Usage: xipe img2mrc.elf -im infile:s <srcFile>";
print " Options:";
print " format:s pdf|xps|all default pdf";
print " ocr:i 0|1 default 1";
print " correctImage:i 0|1 default 1";
print " language:s <language> default english";
print " security:i 0|1 default 0";
print " visibleText:i 0|1 default 0";
print " verbosity:i 0|1|2 default 1";
print " Reorient should be turned off for";
print " non-Latin 1 languages.";
end;
}
/*
* This is needed so real rotate matches behavior of lazyRotate.
* Don't want the image width/height to be modified (other than swapping them)
*/
PROCEDURE hardRotate(XIPIMAGE img, DOUBLE angle)
RETURNS (XIPIMAGE out)
{
INTEGER ww = img.imageWidth;
INTEGER hh = img.imageHeight;
if (angle < 0 ) angle = angle + 360.0;
if (angle >= 360 ) angle = angle - 360.0;
INTEGER cnt = angle/90; // This does rounding
DOUBLE orient = cnt*90;
DOUBLE skew = angle - orient;
img = img.rotate ( fangle: orient, nomask: 1);
if ( (cnt%2)==1 ) {
img.imageHeight = ww;
img.imageWidth = hh;
}
out = img.rotate ( fangle: skew, nomask: 1, lock: 1);
}
PROCEDURE convertToBinary (XIPIMAGE input)
RETURNS (XIPIMAGE mask)
{
// Loop through all layers getting list of images and normalized offsets
ELFLIST imgs; // list of images to be merged
ELFLIST posList; // list of x,y merge positions
INTEGER i;
STATUS status;
XIPIMAGE tmp;
INTEGER ltype;
for ( i=0; i<input.nlayers; i++ ) {
ltype = input.getMember (member:"layerType", num: i);
if (ltype == XIP_ColorMask || ltype == XIP_ContoneMask) {
tmp = input.getLayer(num:i).unCompress();
// Add mask layer to accomodate image overlaps
tmp = tmp.channel (command: ("Insert image 1 Mask A"), input: (tmp) );
imgs.insert ( obj: tmp);
posList.insert (obj:input.getMember(num:i,member:"ypos") / input.imageHeight);
posList.insert (obj:input.getMember(num:i,member:"xpos") / input.imageWidth);
}
}
STRING res = "Origin:resolution:" + input.resolution[0];
if (input.nlayers > 1) {
// Create a background plane and merge all layers onto it
try {
mask = pattern (constant:(0), space: "klinear",
size: (input.imageWidth, input.imageHeight)
).convert (to: (1)
).nmerge (input: imgs,
foffset: posList
).modheader (modify: ("Photometry:name:graylinear")
).modheader (modify: (res)
).paper (
).invert (
).exec ();
} catch {
print status.message; end;
}
}
else mask = input.getLayer(num:0).Copy();
}
PROCEDURE getAngleAndOCR(XIPIMAGE img, STRING language, INTEGER visible, INTEGER ocr)
RETURNS(DOUBLE corr)
{
XIPIMAGE binimg = convertToBinary (input:img);
DOUBLE orient = binimg.orient();
DOUBLE skew = -1.0 * skewAngle ( img: binimg, type: "binary" );
if (skew > -0.1 && skew < 0.1) skew = 0;
corr = skew + orient;
print " Correction angle: "+orient+" "+skew+" = "+corr;
if (ocr) {
BOOLEAN doCorr = corr != 0;
if (doCorr) {
binimg = hardRotate(img: binimg, angle: corr);
} else {
corr = 0;
}
INTEGER ww = binimg.imageWidth;
INTEGER hh = binimg.imageHeight;
STRING ocrxdoc = binimg.fwxOCR (texttype: "XDOC", language: language);
XIPIMAGE ocrimg = XDOCtoXIPXML(xdoc: ocrxdoc);
// print PrintImageLayers(img:ocrimg);
ocrimg.imageWidth = ww; // The xdoc dimensions are sometimes a little off
ocrimg.imageHeight = hh; // The xdoc dimensions are sometimes a little off
// print PrintImageLayers(img:ocrimg);
// ocrxdoc.Write(filename: "junk.xdoc");
if (doCorr) {
ocrimg.setTransform(op: "rotate", angle: -corr);
}
if (visible) {
ocrimg.setMember (member: "visibility", value: TRUE);
}
img.addLayer(image:ocrimg, ltype: XIP_Text);
}
}
// *** MAIN ******************************************************************
XIPIMAGE img;
XIPIMAGE thumb;
DOUBLE angle = 0;
if (infile.ext() == "jpg") {
img = readjpg (filename: infile, compressed:TRUE, rawcolor: TRUE);
thumb = readjpg (filename: infile).thumbnail(size: (200, 200));
} else {
img = readimage (filename: infile);
thumb = img.thumbnail(size: (200, 200));
}
XIPIMAGE ims = img.fijiSeg (cfgfile: "$XIPTOP/data/fiji/fijiNlc.cfg");
if (verbosity>0) print " " + TimeCheck() + " secs to read and compress.";
if (verbosity>1) print PrintImageLayers(img:ims);
if (correctImage || ocr) {
angle = getAngleAndOCR(
img: ims, language: language, visible: visibleText, ocr: ocr);
if (verbosity>1) print PrintImageLayers(img:ims);
}
if (correctImage && angle!=0) {
ims.setTransform(op: "rotate", angle: angle);
thumb = hardRotate(img:thumb, angle: angle);
}
ims.addLayer(image:thumb, ltype: XIP_Thumbnail);
if (verbosity>1) print PrintImageLayers(img:ims);
ims.setTransform(op: "center", std:"US");
if (verbosity>1) print PrintImageLayers(img:ims);
if (format == "xps" || format == "all") {
System (cmd : "(rm -rf "+ infile.name()+".xps" + ") > /dev/null; ");
DOCUMENTWRITER dwxps = CreateDocumentWriter (filename: infile.name()+".xps");
dwxps.setAttr(name:"_XPSsecurity", obj:security);
dwxps.appendPage (pgImg: ims); dwxps.release();
if (verbosity>0) print " writing:" + infile.name()+".xps";
}
if (format == "pdf" || format == "all") {
DOCUMENTWRITER dwpdf = CreateDocumentWriter (filename: infile.name()+".pdf");
dwpdf.appendPage (pgImg: ims); dwpdf.release();
if (verbosity>0) print " writing:" + infile.name()+".pdf";
}